#include "ProductorDeClientes.h"
#include <iostream>

void ProductorDeClientes::producirCliente() {
	fifo.escribir("*", 1);
}

ProductorDeClientes::ProductorDeClientes(const string& nombreProceso,
		bool logActivo) :
		Proceso(nombreProceso, logActivo), fifo(
				Constantes::ARCHIVO_FIFO_PRODUCTOR_CONSUMIDOR_DE_CLIENTES) {

}

ProductorDeClientes::~ProductorDeClientes() {
	fifo.cerrar();
	fifo.eliminar();
}

void ProductorDeClientes::run() {
	int codigoSalida = 0;
	// event handler para la senial SIGINT (-2)
	SIGINT_Handler sigint_handler;
	// se registra el event handler declarado antes
	SignalHandler::getInstance()->registrarHandler(SIGINT, &sigint_handler);

	fifo.abrir();
	int contador = 0;

	// Produce clientes indefinidamente
	while (sigint_handler.getGracefulQuit() == 0) {
		try {
			producirCliente();
			contador++;
			stringstream ss;
			ss << contador;
			string msg = "Produje el cliente numero: " + ss.str();
			getLogger().info(msg.c_str());
			sleep(
					GeneradorRandom::obtenerNumeroConMediaYDesvio(
							Constantes::MEDIA_PRODUCCION_CLIENTES,
							Constantes::DESVIO_PRODUCCION_CLIENTES));
		} catch (const CantWriteException& e) {
			/* Si no puede escribir al fifo, termina de producir
			 * Aca va a entrar si se cierra el jefe antes que el productor
			 * Es algo normal que pase al finalizar el programa. */
			codigoSalida = 1;
			getLogger().error("No se pudo escribir en el fifo");
			break;
		}
	}
	// se recibio la senial SIGINT, el proceso termina
	if (codigoSalida == 0) {
		getLogger().warn("Se recibio la senial SIGINT, el proceso se termina.");
	}
	SignalHandler::destruir();
}

